function knapsack(w, v, C) {
    let length = w.length
    if (length === 0) return 0

    // 对照表格，生成的二维数组，第一维代表物品，第二维代表背包剩余容量
    // 第二维中的元素代表背包物品总价值
    let array = new Array(length).fill(new Array(C).fill(null))

    // 完成底部子问题的解
    for (let i = 0; i < C; i++) {
        // 对照表格第一行， array[0] 代表物品 1
        // i 代表剩余总容量
        // 当剩余总容量大于物品 1 的重量时，记录下背包物品总价值，否则价值为 0
        array[0][i] = i >= w[0] ? v[0] : 0
    }

    // 自底向上开始解决子问题，从物品 2 开始
    for (let i = 1; i < length; i++) {
        for (let j = 1; j <= C; j++) {
            // 这里求解子问题，分别为不放当前物品和放当前物品
            // 先求不放当前物品的背包总价值，这里的值也就是对应表格中上一行对应的值
            array[i][j] = array[i - 1][j]
            // 判断当前剩余容量是否可以放入当前物品
            if (j >= w[i]) {
                // 可以放入的话，就比大小
                // 放入当前物品和不放入当前物品，哪个背包总价值大
                array[i][j] = Math.max(array[i-1][j], v[i] + array[i - 1][j - w[i]])
            }
        }
    }
    return array[length - 1][C-1]
}
// knapsack([1,2,3],[3,7,12],5)

console.log(knapsack([2,2,6,5,4],[6,3,5,4,6],10))